package fitnesshub.controller;

import fitnesshub.result.Result;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FileUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.nio.file.Paths;
import java.util.UUID;

/**
 * 文件管理
 */
@RestController
@RequestMapping("/files")
@Slf4j
public class FileController {

    @Value("${file.upload-dir}") // 从配置文件中读取文件存储根目录
    private String baseDir;

    @Value("${file.server.url}") // 从配置文件中读取服务器地址
    private String serverUrl;

    /**
     * 文件上传
     *
     * @param type 什么实体的文件
     * @param file 文件
     * @return 状态码和访问路径
     */
    @PostMapping("/upload")
    public Result<String> uploadFile(
            @RequestParam("type") Integer type,
            @RequestParam("file") MultipartFile file) {
        if (file.isEmpty()) {
            return Result.error("文件为空");
        }

        // 确定存储路径
        String targetDir;
        switch (type) {
            case 1:
                targetDir = "admin";
                break;
            case 2:
                targetDir = "member";
                break;
            case 3:
                targetDir = "coach";
                break;
            case 4:
                targetDir = "equipment";
                break;
            case 5:
                targetDir = "course";
                break;
            default:
                return Result.error("未知的文件类型");
        }

        // 获取原始文件名并生成唯一文件名
        String originalFilename = file.getOriginalFilename();
        if (originalFilename == null || originalFilename.isEmpty()) {
            return Result.error("无效的文件名");
        }
        int lastDotIndex = originalFilename.lastIndexOf(".");
        if (lastDotIndex == -1) {
            return Result.error("无效的文件扩展名");
        }
        String fileExtension = originalFilename.substring(lastDotIndex);
        String uniqueFilename = UUID.randomUUID() + fileExtension;

        // 构建完整路径
        String filePath = Paths.get(baseDir, targetDir, uniqueFilename).toString();
        File destFile = new File(filePath);

        // 确保目录存在
        File directory = new File(Paths.get(baseDir, targetDir).toString());
        if (!directory.exists() && !directory.mkdirs()) {
            log.error("创建目录失败: {}", directory.getAbsolutePath());
            return Result.error("创建目录失败");
        }

        try {
            // 保存文件
            FileUtils.copyInputStreamToFile(file.getInputStream(), destFile);
            log.info("文件上传成功: 文件名={}, 目标路径={}", originalFilename, filePath);

            // 构建完整的访问路径
            String accessPath = String.format("%s/%s/%s", serverUrl, targetDir, uniqueFilename);

            return Result.success(accessPath);
        } catch (IOException e) {
            log.error("文件上传失败: 文件名={}", originalFilename, e);
            return Result.error("文件上传失败");
        }
    }
}